package com.atguigu.crowd.mvc.handler;

import com.atguigu.crowd.constant.CrowdConstant;
import com.atguigu.crowd.entity.Admin;
import com.atguigu.crowd.service.api.AdminService;
import com.github.pagehelper.PageInfo;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import javax.servlet.http.HttpSession;

@Controller
public class AdminHandler {
    @Autowired
    AdminService adminService;
//    @PathVariable是对admin/remove/{adminId}/{pageNum}/{keyword}.html请求URL中的变量进行解析，没有不会报错。
//    @RequestParam是对用户在url中传过来的数据(可以是使用get方式)进行解析，没有会报错
    @RequestMapping("admin/update.html")
    public String update(Admin admin, @RequestParam("pageNum") Integer pageNum, @RequestParam("keyword") String keyword){

        adminService.update(admin);
        return "redirect:/admin/get/page.html?keyword="+keyword+"&pageNum="+pageNum;
    }

//    在jsp页面中
//    通过addAttribute添加到请求域中到数据要通过${requestScope.}来获取
//    通过url或者表单提交的数据要使用${param.} 来获取
//    在handler方法中
//    通过url或者表单提交的数据要使用HttpServletRequest.getParameter() 来获取
//    request.getSession()来获取session。setAttribute()就可以把数据保存到session中。在jsp页面使用${}直接获取
    @RequestMapping("admin/to/edit/page.html")
    public String toEditPage(
            @RequestParam("adminId") Integer adminId,
            ModelMap modelMap
            ){
        Admin admin = adminService.getAdminById(adminId);
        modelMap.addAttribute("admin",admin);
        return "admin-edit";
    }

    @RequestMapping("admin/save.html")
    public String save(Admin admin){
        adminService.saveAdmin(admin);
        return "redirect:/admin/get/page.html?pageNum="+Integer.MAX_VALUE;
    }

    @RequestMapping("admin/remove/{adminId}/{pageNum}/{keyword}.html")
    public String remove(@PathVariable("adminId") Integer adminId,@PathVariable("pageNum") Integer pageNum,@PathVariable("keyword") String keyword){
        adminService.remove(adminId);
        // 尝试方案1：直接转发到admin-page.jsp会无法显示分页数据
        // return "admin-page";

        // 尝试方案2：内部转发到/admin/get/page.html地址，浏览器的地址栏是不变的，还是刚刚删除的请求地址，一旦刷新页面会重复执行删除浪费性能
        // return "forward:/admin/get/page.html";

        // 尝试方案3：重定向到/admin/get/page.html地址
        // 同时为了保持原本所在的页面和查询关键词再附加pageNum和keyword两个请求参数
        return "redirect:/admin/get/page.html?keyword="+keyword+"&pageNum="+pageNum;
    }

    @RequestMapping("/admin/do/login.html")
    public String doLogin(
            @Param("loginAcct") String loginAcct,
            @Param("userPswd") String userPswd,
            HttpSession session
    ) {
        Admin admin = adminService.getAdminByLoginAcct(loginAcct, userPswd);
        session.setAttribute(CrowdConstant.ATTR_NAME_LOGIN_ADMIN, admin);
        return "redirect:/admin/to/main/page.html";
    }

    @RequestMapping("/admin/do/logout.html")
    public String doLogout(HttpSession httpSession) {
        httpSession.invalidate();
        return "redirect:/admin/to/login/page.html";
    }

    @RequestMapping("/admin/get/page.html")
    public String getAdminPage(
            // 注意:页面上有可能不提供关键词，要进行适配
            // 在@RequestParam注解中设置defaultValue属性为空字符串表示浏览器不提 供关键词时，keyword 变量赋值为空字符串
            @RequestParam(value = "keyword", defaultValue = "") String keyword,
            // 浏览器未提供 pageNum 时，默认前往第一页
            @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum,
            // 浏览器未提供 pageSize 时，默认每页显示 5 条记录
            @RequestParam(value="pageSize", defaultValue="5") Integer pageSize,
            ModelMap modelMap) {
        // 查询得到分页数据
        PageInfo<Admin> pageInfo = adminService.getAdminPage(keyword, pageNum, pageSize);
        // 将分页数据存入模型
        modelMap.addAttribute(CrowdConstant.ATTR_NAME_PAGE_INFO, pageInfo);
        return "admin-page";
    }

}
